package com.kuang.unsafe;

import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Map 单线程下是安全的，并发情况下不安全。
 * 并发情况下，有些集合类会报错：并发修改异常  ConcurrentModificationException
 *
 * 解决办法：
 *  方式1 集合工具类+同步锁 Collections.synchronizedMap
 *  方式2 并发哈希Map ConcurrentHashMap
 */
public class MapTest {
    public static void main(String[] args) {


        // 单线程下安全
        //Map<String, String> map = new HashMap<>();
        //// 加载因子，初始化容量 new HashMap<>(16,  0.75);
        //for (int i = 0; i < 1000; i++) {
        //    map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
        //    System.out.println(map);
        //}


        // 多线程下，发生并发修改异常
        //Map<String, String> map = new HashMap<>();
        //// 加载因子，初始化容量 new HashMap<>(16,  0.75);
        //for (int i = 0; i < 100; i++) {
        //    new Thread(()->{
        //        map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
        //        System.out.println(map);
        //    }).start();
        //}


        // 方式1 集合工具类+同步锁 Collections.synchronizedMap
        //Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
        //// 加载因子，初始化容量 new HashMap<>(16,  0.75);
        //for (int i = 0; i < 100; i++) {
        //    new Thread(()->{
        //        map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
        //        System.out.println(map);
        //    }).start();
        //}


        // 方式2 并发哈希Map ConcurrentHashMap
        Map<String, String> map = new ConcurrentHashMap<>();
        // 加载因子，初始化容量 new HashMap<>(16,  0.75);
        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
                System.out.println(map);
            }).start();
        }

    }
}
